/**
 * Copyright (c) 2011-2016, James Zhan 詹波 (jfinal@126.com).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.weixin.sdk.json;

import org.apache.commons.lang3.StringUtils;

/**
 * json string 与 object 互转抽象
 */
public abstract class Json {

    private static IJsonFactory defaultJsonFactory = new JacksonFactory();

    /**
     * 当对象级的 datePattern 为 null 时使用 defaultDatePattern
     * jfinal 2.1 版本暂定 defaultDatePattern 值为 null，即 jackson、fastjson
     * 默认使用自己的 date 转换策略
     */
    private static String defaultDatePattern = null;

    /**
     * Json 继承类优先使用对象级的属性 datePattern, 然后才是全局性的 defaultDatePattern
     */
    protected String datePattern = null;

    static void setDefaultJsonFactory(IJsonFactory defaultJsonFactory) {
        if (defaultJsonFactory == null) {
            throw new IllegalArgumentException("defaultJsonFactory can not be null.");
        }
        Json.defaultJsonFactory = defaultJsonFactory;
    }

    static void setDefaultDatePattern(String defaultDatePattern) {
        if (StringUtils.isBlank(defaultDatePattern)) {
            throw new IllegalArgumentException("defaultDatePattern can not be blank.");
        }
        Json.defaultDatePattern = defaultDatePattern;
    }

    public Json setDatePattern(String datePattern) {
        if (StringUtils.isBlank(datePattern)) {
            throw new IllegalArgumentException("datePattern can not be blank.");
        }
        this.datePattern = datePattern;
        return this;
    }

    public String getDatePattern() {
        return datePattern;
    }

    public String getDefaultDatePattern() {
        return defaultDatePattern;
    }

    public static Json getJson() {
        return defaultJsonFactory.getJson();
    }

    public abstract String toJson(Object object);

    public abstract <T> T parse(String jsonString, Class<T> type);
}




